home *** CD-ROM | disk | FTP | other *** search
/ The Programmer Disk / The Programmer Disk (Microforum).iso / xpro / c4 / pro20 / mgrtopbm.c < prev    next >
C/C++ Source or Header  |  1990-05-31  |  3KB  |  122 lines

  1. /* mgrtopbm.c - read a MGR bitmap and produce a portable bitmap
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include "pbm.h"
  15. #include "mgr.h"
  16.  
  17. main( argc, argv )
  18. int argc;
  19. char *argv[];
  20.     {
  21.     FILE *ifd;
  22.     register bit *bitrow, *bP;
  23.     bit getbit();
  24.     int rows, cols, depth, padright, row, col;
  25.  
  26.     pm_progname = argv[0];
  27.  
  28.     if ( argc > 2 )
  29.     pm_usage( "[mgrfile]" );
  30.  
  31.     if ( argc == 2 )
  32.     ifd = pm_openr( argv[1] );
  33.     else
  34.     ifd = stdin;
  35.  
  36.     getinit( ifd, &cols, &rows, &depth, &padright );
  37.     if ( depth != 1 )
  38.     pm_error( "MGR file has depth of %d, must be 1", depth, 0,0,0,0 );
  39.  
  40.     pbm_writepbminit( stdout, cols, rows );
  41.     bitrow = pbm_allocrow( cols );
  42.  
  43.     for ( row = 0; row < rows; row++ )
  44.     {
  45.     /* Get data, bit-reversed within each byte. */
  46.         for ( col = 0, bP = bitrow; col < cols; col++, bP++ )
  47.         *bP = getbit( ifd );
  48.     /* Discard line padding */
  49.         for ( col = 0; col < padright; col ++ )
  50.         (void) getbit( ifd );
  51.     pbm_writepbmrow( stdout, bitrow, cols );
  52.     }
  53.  
  54.     pm_close( ifd );
  55.  
  56.     exit( 0 );
  57.     }
  58.  
  59.  
  60. unsigned char item;
  61. int bitsperitem, bitshift;
  62.  
  63. getinit( file, colsP, rowsP, depthP, padrightP )
  64. FILE *file;
  65. int *colsP, *rowsP, *depthP, *padrightP;
  66.     {
  67.     struct b_header head;
  68.     int pad;
  69.  
  70.     if ( fread( &head, sizeof(struct old_b_header), 1, file ) != 1 )
  71.     pm_perror( "reading header" );
  72.     if ( head.magic[0] == 'y' && head.magic[1] == 'z' )
  73.     { /* new style bitmap */
  74.     if ( fread( &head.depth, sizeof(head) - sizeof(struct old_b_header), 1, file ) != 1 )
  75.         pm_perror( "reading rest of header" );
  76.     *depthP = (int) head.depth - ' ';
  77.     pad = 8;
  78.     }
  79.     else if ( head.magic[0] == 'x' && head.magic[1] == 'z' )
  80.     { /* old style bitmap with 32-bit padding */
  81.     *depthP = 1;
  82.     pad = 32;
  83.     }
  84.     else if ( head.magic[0] == 'z' && head.magic[1] == 'z' )
  85.     { /* old style bitmap with 16-bit padding */
  86.     *depthP = 1;
  87.     pad = 16;
  88.     }
  89.     else if ( head.magic[0] == 'z' && head.magic[1] == 'y' )
  90.     { /* old style 8-bit pixmap with 16-bit padding */
  91.     *depthP = 8;
  92.     pad = 16;
  93.     }
  94.     else
  95.     pm_error(
  96.         "bad magic chars in MGR file: '%c%c'",
  97.         head.magic[0], head.magic[1], 0,0,0 );
  98.     *colsP = ( ( (int) head.h_wide - ' ' ) << 6 ) + ( (int) head.l_wide - ' ' );
  99.     *rowsP = ( ( (int) head.h_high - ' ' ) << 6 ) + ( (int) head.l_high - ' ' );
  100.     *padrightP = ( ( *colsP + pad - 1 ) / pad ) * pad - *colsP;
  101.  
  102.     bitsperitem = 8;
  103.     }
  104.  
  105. bit
  106. getbit( file )
  107. FILE *file;
  108.     {
  109.     bit b;
  110.  
  111.     if ( bitsperitem == 8 )
  112.     {
  113.     item = getc( file );
  114.     bitsperitem = 0;
  115.     bitshift = 7;
  116.     }
  117.     bitsperitem++;
  118.     b = ( ( item >> bitshift) & 1 ) ? PBM_BLACK : PBM_WHITE;
  119.     bitshift--;
  120.     return b;
  121.     }
  122.